`
https://leetcode.cn/problems/add-binary/
`

/**
 * @param {string} a
 * @param {string} b
 * @return {string}
 */
var addBinary = function (a, b) {
  // 先把输入的这两个二进制串反转，低位放在前面，方便处理进位
  a = a.split('').reverse().join('');
  b = b.split('').reverse().join('');
  // 存储结果
  const res = [];

  const m = a.length, n = b.length;
  // carry 记录进位
  let carry = 0;
  let i = 0;

  // 开始类似 [2. 两数相加](https://leetcode.cn/problems/add-two-numbers) 的加法模拟逻辑
  // 只是这里运算的是二进制字符串
  while (i < Math.max(m, n) || carry > 0) {
    let val = carry;
    val += i < m ? parseInt(a[i]) : 0;
    val += i < n ? parseInt(b[i]) : 0;
    res.push(val % 2);
    carry = Math.floor(val / 2);
    i++;
  }

  return res.reverse().join('')
};